package cn.edu.lcu.cs.javaprogramming.thread.producer_consumer.piped;


import lombok.Cleanup;
import lombok.SneakyThrows;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PipedInputStream;
import java.util.Random;

/**
 * 消费者线程。
 *
 * @author ling
 * @date 2022/5/30 23:25
 */
public class Consumer implements Runnable {
    /**
     * 管道输入流，消费者数据的来源。
     */
    private PipedInputStream source;

    public PipedInputStream getSource() {
        return source;
    }

    public Consumer() {
        source = new PipedInputStream();
    }

    @SneakyThrows
    @Override
    public void run() {
        // 创建对象输入流，并与管道输入流绑定。
        // 从对象流中读取对象，即从管道流中读取对象。
        @Cleanup
        ObjectInputStream inputStream = new ObjectInputStream(source);
        while (true) {
            try  {
                // 从对象流中读取完整对象
                Product product = (Product) inputStream.readObject();
                // 消费
                consume(product);
                // 随机休眠，仅用于演示。
                Thread.sleep(new Random().nextInt(2000));
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    private void consume(Product product) {
        System.err.println(Thread.currentThread().getName() + " 消费了产品 " + product);
    }
}
